<template>
  <!-- 用于播放的容器 -->
  <div style="display: flex;justify-content: space-between;" class="jk-wrap">

    <div id="playWnd" class="playWnd"></div>
    <div slot="footer" class="dialog-footer" style="margin-left: 40px;">
      <div style="padding-top: 10px;">
        <div>开始时间</div>
        <el-date-picker :type="'datetime'" @change="handleQuery" v-model="enforcementStartTime" popper-class="el-date-spe"
          format="YYYY-MM-DD HH:mm:ss" style="width: 200px" @keyup.enter="handleQuery"/>
      </div>
      <div>
        <div>结束时间</div>
        <el-date-picker :type="'datetime'" @change="handleQuery" v-model="enforcementEndTime" format="YYYY-MM-DD HH:mm:ss" popper-class="el-date-spe"
          style="width: 200px" @keyup.enter="handleQuery" />
      </div>
      <div>
        <el-button type="primary" @click="startPlayback" size="large" style="float: right;margin-top: 10px;">播放</el-button>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      visible: false,
      initCount: 0,
      pubKey: "",
      oWebControl: "",
      cameraIndexCode: "", // 设备编码
      enforcementStartTime: "2023-01-01 00:00:00", // 开始时间
      enforcementEndTime: "2023-01-02 00:00:00", // 结束时间
    };
  },
  activated() { },
  methods: {
    // 创建WebControl实例与启动插件
    initPlugin() {
      // vue弹框调这个方法进来，，传入 【摄像头code，回放开始时间，结束时间】
      this.visible = true;
      var that = this;

      // eslint-disable-next-line
      that.oWebControl = new WebControl({
        szPluginContainer: "playWnd", // 指定容器id
        iServicePortStart: 15900, // 指定起止端口号，建议使用该值
        iServicePortEnd: 15909,
        cbConnectSuccess: function () {
          // 创建成功
          // 实例创建成功后需要启动服务
          that.oWebControl
            .JS_StartService("window", { dllPath: "./VideoPluginConnect.dll" })
            .then(
              function () {
                that.oWebControl.JS_SetWindowControlCallback({
                  // 设置消息回调
                  cbIntegrationCallBack: that.cbIntegrationCallBack,
                });

                that.oWebControl
                  .JS_CreateWnd("playWnd", 1300, 834)
                  .then(function () {
                    // JS_CreateWnd创建视频播放窗口，宽高可设定
                    that.init(); // 创建播放实例成功后初始化
                  });
              },
              function () { }
            );
        },
        cbConnectError: function () {
          // 创建失败
          that.oWebControl = null;
          document.getElementById("playWnd").innerHTML =
            "插件未启动，正在尝试启动，请稍候...";
          // eslint-disable-next-line
          WebControl.JS_WakeUp("VideoWebPlugin://"); // 程序未启动时执行error函数，采用wakeup来启动程序
          that.initCount++;
          if (that.initCount < 3) {
            setTimeout(function () {
              that.initPlugin();
            }, 3000);
          } else {
            document.getElementById("playWnd").innerHTML =
              "插件启动失败，请检查插件是否安装！";
          }
        },
        cbConnectClose: function () {
          that.oWebControl = null;
        },
      });
    },
    // 推送消息
    cbIntegrationCallBack(oData) {
      console.log(JSON.stringify(oData.responseMsg));
    },
    // 初始化
    init() {
      const { monitorHost, monitorIp, monitorPassword, monitorUserName } =
        this.$route.query;

      var that = this;
      // 获取海康平台 配置中心
      // 创建 播放器
      this.getPubKey(function () {
        // 请自行修改以下变量值
        var appkey = monitorUserName || "28238188"; //综合安防管理平台提供的appkey，必填

        var secret = that.setEncrypt(monitorPassword || "AlDrRjv7JLfP9S8N3LxW"); //setEncrypt('rNiT4CyBEjXiNfCdGb2G') //综合安防管理平台提供的secret，必填

        var ip = monitorIp || "192.168.7.100"; //综合安防管理平台IP地址，必填

        var playMode = 1; // 初始播放模式：0-预览，1-回放
        var port = Number(monitorHost) || 443; //综合安防管理平台端口，若启用HTTPS协议，默认443
        var snapDir = "D:\\SnapDir"; //抓图存储路径
        var videoDir = "D:\\VideoDir"; //紧急录像或录像剪辑存储路径

        var layout = "1x1"; // playMode指定模式的布局
        var enableHTTPS = 1; // 是否启用HTTPS协议与综合安防管理平台交互，这里总是填1
        var encryptedFields = "secret"; // 加密字段，默认加密领域为secret
        var showToolbar = 1; // 是否显示工具栏，0-不显示，非0-显示
        var showSmart = 1; // 是否显示智能信息（如配置移动侦测后画面上的线框），0-不显示，非0-显示
        var buttonIDs =
          "0,16,256,257,258,259,260,512,513,514,515,516,517,768,769"; // 自定义工具条按钮
        // var reconnectTimes = 2                                // 重连次数，回放异常情况下有效
        // var reconnectTime = 4                                 // 每次重连的重连间隔 >= reconnectTime
        // 请自行修改以上变量值

        that.oWebControl
          .JS_RequestInterface({
            funcName: "init",
            argument: JSON.stringify({
              appkey: appkey, // API网关提供的appkey
              secret: secret, // API网关提供的secret
              ip: ip, // API网关IP地址
              playMode: playMode, // 播放模式（决定显示预览还是回放界面）
              port: port, // 端口
              snapDir: snapDir, // 抓图存储路径
              videoDir: videoDir, // 紧急录像或录像剪辑存储路径
              layout: layout, // 布局
              enableHTTPS: enableHTTPS, // 是否启用HTTPS协议
              encryptedFields: encryptedFields, // 加密字段
              showToolbar: showToolbar, // 是否显示工具栏
              showSmart: showSmart, // 是否显示智能信息
              buttonIDs: buttonIDs, // 自定义工具条按钮
              // reconnectTimes：reconnectTimes,      // 重连次数
              // reconnectDuration：reconnectTime     // 重连间隔
            }),
          })
          .then(function (oData) {
            that.oWebControl.JS_Resize(1300, 834); // 初始化后resize一次，规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
            // that.startPlayback(); // 开始播放
          });
      });
    },
    // 获取公钥
    getPubKey(callback) {
      var that = this;
      that.oWebControl
        .JS_RequestInterface({
          funcName: "getRSAPubKey",
          argument: JSON.stringify({
            keyLength: 1024,
          }),
        })
        .then(function (oData) {
          if (oData.responseMsg.data) {
            that.pubKey = oData.responseMsg.data;
            callback();
          }
        });
    },

    // RSA加密
    setEncrypt(value) {
      var that = this;
      // eslint-disable-next-line
      var encrypt = new JSEncrypt();
      encrypt.setPublicKey(that.pubKey);
      return encrypt.encrypt(value);
    },

    // 录像回放功能
    startPlayback() {
      const { monitorCode } = this.$route.query;
      var that = this;
      if (monitorCode == null) {
        if (this.oWebControl != null) {
          that.oWebControl.JS_HideWnd(); // 先让窗口隐藏，规避插件窗口滞后于浏览器消失问题
          that.oWebControl.JS_Disconnect().then(
            function () { },
            function () { }
          );
        }
        document.getElementById("playWnd").innerHTML = "该设备无回放数据";
        return;
      }
      // new Date('2022/09/21 12:00:00').getTime()    测试用时间
      var cameraIndexCode = monitorCode; // 获取输入的监控点编号值，必填
      var startTimeStamp = new Date(that.enforcementStartTime).getTime(); // 回放开始时间戳，必填
      var endTimeStamp = new Date(that.enforcementEndTime).getTime(); // 回放结束时间戳，必填
      var recordLocation = 1; //录像存储位置：0-中心存储，1-设备存储
      var transMode = 1; //传输协议：0-UDP，1-TCP
      var gpuMode = 0; //是否启用GPU硬解，0-不启用，1-启用
      var wndId = -1; //播放窗口序号（在2x2以上布局下可指定播放窗口）

      that.oWebControl.JS_RequestInterface({
        funcName: "startPlayback",
        argument: JSON.stringify({
          cameraIndexCode: cameraIndexCode, // 监控点编号
          startTimeStamp: Math.floor(startTimeStamp / 1000).toString(), // 录像查询开始时间戳，单位：秒
          endTimeStamp: Math.floor(endTimeStamp / 1000).toString(), // 录像结束开始时间戳，单位：秒
          recordLocation: recordLocation, // 录像存储类型：0-中心存储，1-设备存储
          transMode: transMode, // 传输协议：0-UDP，1-TCP
          gpuMode: gpuMode, // 是否启用GPU硬解，0-不启用，1-启用
          wndId: wndId, // 可指定播放窗口
        }),
      });
    },

    // 停止回放
    stopAllPlayback() {
      this.oWebControl.JS_RequestInterface({
        funcName: "stopAllPlayback",
      });
    },
    // 关闭弹框
    close() {
      this.visible = false;
      if (this.oWebControl != null) {
        this.oWebControl.JS_HideWnd(); // 先让窗口隐藏，规避插件窗口滞后于浏览器消失问题
        this.oWebControl.JS_Disconnect().then(
          function () { },
          function () { }
        );
      }
    },
  },
  mounted() {
    this.initPlugin();
  },
};
</script>
<style scoped>
.playWnd {
  width: 1300px;
  /*播放容器的宽和高设定*/
  height: 834px;
}
</style>
<style>
.el-date-spe .el-date-picker{
  width: 200px!important;
}
.el-date-spe .el-picker-panel__content{
    width: 180px!important;
  }
</style>





